
#include <linux/i2c.h>
#include <asm/io.h>

#include "iic.h"

/* i2c 通信函数 */
int iic_regs16_read(struct iic_dev *dev, u16 reg, void *val, int len)
{
    int ret;
    u8 regdata[2] = {0};
    struct i2c_msg msg[2];
    struct i2c_client *client = (struct i2c_client *)dev->private_data;

    regdata[0] = reg >> 8;
    regdata[1] = reg & 0xff;
    /* msg[0]，第一条写消息，发送要读取的寄存器首地址 */
    msg[0].addr = client->addr; /* I2C器件地址 */
    msg[0].flags = 0;           /* 标记为写数据 */
    msg[0].buf = regdata;       /* 读取的首地址 */
    msg[0].len = 2;             /* reg长度 */

    /* msg[1]，第二条读消息，读取寄存器数据 */
    msg[1].addr = client->addr; /* I2C器件地址 */
    msg[1].flags = I2C_M_RD;    /* 标记为读取数据 */
    msg[1].buf = val;           /* 读取数据缓冲区 */
    msg[1].len = len;           /* 要读取的数据长度 */
    
    ret = i2c_transfer(client->adapter, msg, 2);
    if (ret != 2)
    {
        printk(KERN_DEBUG "\n i2c_read_i2c error \n");
        return -1;
    }

    return 0;
}
EXPORT_SYMBOL(iic_regs16_read);

s32 iic_regs16_write(struct iic_dev *dev, u16 reg, u8 *buf, u8 len)
{
    u8 b[256];
    struct i2c_msg msg;
    struct i2c_client *client = (struct i2c_client *)dev->private_data;

    b[0] = reg >> 8;             /* 寄存器首地址高位 */
    b[1] = reg & 0xff;             /* 寄存器首地址低位 */
    memcpy(&b[2], buf, len);  /* 将要发送的数据拷贝到数组 b里面 */

    msg.addr = client->addr; /* I2C器件地址 */
    msg.flags = 0;          /* 标记为写数据 */

    msg.buf = b;            /* 要发送的数据缓冲区 */
    msg.len = len + 2;      /* 要发送的数据长度 */

    return i2c_transfer(client->adapter, &msg, 1);
}
EXPORT_SYMBOL(iic_regs16_write);

int iic_regs_read(struct iic_dev *dev, u8 reg, void *val, int len)
{
    int ret;
    struct i2c_msg msg[2];
    struct i2c_client *client = (struct i2c_client *)dev->private_data;

    /* msg[0]，第一条写消息，发送要读取的寄存器首地址 */
    msg[0].addr = client->addr; /* I2C器件地址 */
    msg[0].flags = 0;           /* 标记为写数据 */
    msg[0].buf = &reg;          /* 读取的首地址 */
    msg[0].len = 1;             /* reg长度 */

    /* msg[1]，第二条读消息，读取寄存器数据 */
    msg[1].addr = client->addr; /* I2C器件地址 */
    msg[1].flags = I2C_M_RD;    /* 标记为读取数据 */
    msg[1].buf = val;           /* 读取数据缓冲区 */
    msg[1].len = len;           /* 要读取的数据长度 */
    
    ret = i2c_transfer(client->adapter, msg, 2);
    if (ret != 2)
    {
        printk(KERN_DEBUG "\n i2c_read_i2c error \n");
        return -1;
    }

    return 0;
}
EXPORT_SYMBOL(iic_regs_read);

s32 iic_regs_write(struct iic_dev *dev, u8 reg, u8 *buf, u8 len)
{
    u8 b[256];
    struct i2c_msg msg;
    struct i2c_client *client = (struct i2c_client *)dev->private_data;

    b[0] = reg;             /* 寄存器首地址 */
    memcpy(&b[1], buf, len);  /* 将要发送的数据拷贝到数组 b里面 */

    msg.addr = client->addr; /* I2C器件地址 */
    msg.flags = 0;          /* 标记为写数据 */

    msg.buf = b;            /* 要发送的数据缓冲区 */
    msg.len = len + 1;      /* 要发送的数据长度 */

    return i2c_transfer(client->adapter, &msg, 1);
}
EXPORT_SYMBOL(iic_regs_write);

int iic_read_reg(struct iic_dev *dev, u8 reg)
{
    u8 data = 0;
    iic_regs_read(dev, reg, &data, 1);
    return data;
}
EXPORT_SYMBOL(iic_read_reg);

void iic_write_reg(struct iic_dev *dev, u8 reg, u8 data)
{
    u8 buf = 0;
    buf = data;
    iic_regs_write(dev, reg, &buf, 1);
}
EXPORT_SYMBOL(iic_write_reg);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("xue");


